package com.lingchou.cloud.process.client.service;

import com.lc.common.bean.response.Result;
import com.lingchou.cloud.process.api.dto.result.*;
import com.lingchou.cloud.process.api.dto.result.base.ProcessTaskRecordVo;
import com.lingchou.cloud.process.client.entity.DefinitionSupplementary;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;

import java.util.List;

/**
 * 流程工具Service
 * @author LingChou
 */
public interface ProcessUtilService {

    /**
     * 获取 某DeploymentId的最新版本ProcessDefinition对象
     *
     * @param deploymentId 流程发布ID
     * @return ProcessDefinition对象
     */
    ProcessDefinition getProcessDefinition(String deploymentId);

    /**
     * 封装流程定义
     *
     * @param processDefinition 流程定义
     * @return ProcessDefinitionDTO
     */
    ProcessDefinitionDTO buildProcessDefinition(ProcessDefinition processDefinition);

    /**
     * 封装流程定义 返回
     *
     * @param processDefinition 流程定义
     * @param errorMessage 错误信息提示
     * @return Result<ProcessDefinitionDTO>
     */
    Result<ProcessDefinitionDTO> packageReturnProcessDefinition(ProcessDefinition processDefinition, String errorMessage);

    /**
     * 封装流程定义 返回
     *
     * @param deploymentId 流程发布ID
     * @param errorMessage 错误提示信息
     * @return Result<ProcessDefinitionDTO>
     */
    Result<ProcessDefinitionDTO> packageProcessDefinitionByDeploymentId(String deploymentId,String errorMessage);

    /**
     * 封装ProcessInstanceDTO
     *
     * @param processInstance 流程实例
     * @return ProcessInstanceDTO
     */
    ProcessInstanceDTO buildProcessInstance(ProcessInstance processInstance);

    /**
     * 封装 processInstances List
     *
     * @param processInstances 流程实例列表
     * @return ProcessInstanceDTOs
     */
    List<ProcessInstanceDTO> buildProcessInstanceList(List<ProcessInstance> processInstances);

    /**
     * 封装 返回ProcessInstanceDTO
     *
     * @param processInstance 流程实例
     * @param errorMessage 错误提示信息
     * @return  Result<ProcessInstanceDTO>
     */
    Result<ProcessInstanceDTO> packageReturnProcessInstance(ProcessInstance processInstance,String errorMessage);

    /**
     * 封装 返回ProcessInstanceDTO
     *
     * @param processInstances 流程实例
     * @param errorMessage 错误提示信息
     * @return  Result<ProcessInstanceDTO>
     */
    Result<List<ProcessInstanceDTO>> packageReturnProcessInstanceList(List<ProcessInstance> processInstances,String errorMessage);

    /**
     * 封装Task为TaskDTO
     * @param task 任务
     * @param definitionSupplementary 变量
     * @return TaskDTO
     */
    TaskDTO buildTaskDTO(Task task, DefinitionSupplementary definitionSupplementary);

    /**
     * 获取任务活动ID
     * @param taskId 任务ID
     * @return 任务活动ID
     */
    String getTaskDefinitionKey(String taskId);

    /**
     * 封装 返回 TaskDTO
     *
     * @param task 任务
     * @param errorMessage 错误提示信息
     * @return  Result<TaskDTO>
     */
    Result<TaskDTO> packageReturnTaskDTO(Task task,String errorMessage);

    /**
     * 封装Task集合 为 TaskDTO 集合
     * @param tasks 任务结合
     * @return TaskDTO集合
     */
    List<TaskDTO> buildTaskDTOList(List<Task> tasks);

    /**
     * 封装Task集合 为 TaskDTO 集合 返回
     * @param tasks 任务结合
     * @param errorMessage 错误提示信息
     * @return Result<TaskDTO>集合
     */
    Result<List<TaskDTO>> packageReturnTaskDTOList(List<Task> tasks,String errorMessage);

    /**
     * 封装HistoricTaskInstance 为 HistoricTaskInstanceDTO
     * @param historicTaskInstance 历史任务实例
     * @param definitionSupplementary 变量对象
     * @return HistoricTaskInstanceDTO
     */
    HistoricTaskInstanceDTO buildHistoricTaskInstanceDTO(HistoricTaskInstance historicTaskInstance, DefinitionSupplementary definitionSupplementary);

    /**
     * 封装HistoricTaskInstanceList 为 HistoricTaskInstanceDTOList
     * @param historicTaskInstanceList 历史任务实例集合
     * @return HistoricTaskInstanceDTO集合
     */
    List<HistoricTaskInstanceDTO> buildHistoricTaskInstanceDTOList(List<HistoricTaskInstance> historicTaskInstanceList);

    /**
     * HistoricTaskInstance 转 AllTaskDTO
     * @param historicTaskInstance 历史任务实例
     */
    AllTaskDTO buildHistoricTaskInstanceToAllTaskDTO(HistoricTaskInstance historicTaskInstance);

    /**
     * HistoricTaskInstance 集合 转 AllTaskDTO 集合
     * @param historicTaskInstances 历史任务实例集合
     */
    List<AllTaskDTO> buildHistoricTaskInstanceToAllTaskDTOs(List<HistoricTaskInstance> historicTaskInstances);

    /**
     * UserTask 转 ProcessTaskRecordVo
     * @param userTask 用户任务节点对象
     */
    ProcessTaskRecordVo buildUserTaskToProcessTaskRecordVo(UserTask userTask,String processInstanceId);

    /**
     * HistoricTaskInstance 集合 转 ProcessTaskRecordVo 集合
     * @param userTasks 用户任务节点对象集合
     */
    List<ProcessTaskRecordVo> buildUserTasksToProcessTaskRecordVos(List<UserTask> userTasks,String processInstanceId);

    /**
     * userTask 转 AllTaskDTO
     * @param userTask 节点
     */
    AllTaskDTO buildUserTaskToAllTaskDTO(UserTask userTask);

    /**
     * userTask 集合 转 AllTaskDTO 集合
     * @param userTasks 节点集合
     */
    List<AllTaskDTO> buildUserTasksToAllTaskDTO(List<UserTask> userTasks);

    /**
     * 封装HistoricTaskInstanceList 为 HistoricTaskInstanceDTOList 返回
     * @param historicTaskInstanceList 历史任务实例集合
     * @param errorMessage 错误信息
     * @return Result<List<HistoricTaskInstanceDTO>>
     */
    Result<List<HistoricTaskInstanceDTO>> packageReturnHistoricTaskInstanceDTOList(List<HistoricTaskInstance> historicTaskInstanceList,String errorMessage);

    /**
     * 封装HistoricProcessInstance 为 HistoricProcessInstanceDTO
     * @param historicProcessInstance 历史流程实例
     * @return HistoricProcessInstanceDTO
     */
    HistoricProcessInstanceDTO buildHistoricProcessInstanceDTO(HistoricProcessInstance historicProcessInstance);

    /**
     * 封装HistoricProcessInstance 为 HistoricProcessInstanceDTO
     * @param historicProcessInstance 历史流程实例
     * @return HistoricProcessInstanceDTO
     */
    List<HistoricProcessInstanceDTO> buildHistoricProcessInstanceDTOList(List<HistoricProcessInstance> historicProcessInstance);

    /**
     * 封装HistoricProcessInstance 为 HistoricProcessInstanceDTO 返回
     * @param historicProcessInstance 历史流程实例
     * @param errorMessage 错误信息
     * @return Result<List<HistoricProcessInstanceDTO>>
     */
    Result<List<HistoricProcessInstanceDTO>> packageReturnHistoricProcessInstanceDTOList(List<HistoricProcessInstance> historicProcessInstance,String errorMessage);
}
